只屬於一個物件的方法
類別方法?實體方法?
class Class
def haha
puts "hahaha~"
end
end
Integer.haha # 印出 hahaha~
String.haha # 印出 hahaha~
這裡舉出這個例子是想說明,如果乍看 Integer.haha
,寫法很像類別方法,但是這裡用開放類別, Integer 跟String 都是 Class 的實體,因此這裡是實體方法,像這樣的寫法,大家都可以用。
如果我的方法只想給某個物件用呢?
class Engineer
def book_list_1
puts "ruby on rails"
end
end
full_stack = Engineer.new
backend = Engineer.new
def full_stack.book_list_2 # 這裡定義一個方法指定給 full_stack
puts "HTML & CSS"
end
full_stack.book_list_1 # 印出 ruby on rails
backend.book_list_1 # 印出 ruby on rails
full_stack.book_list_2 # 印出 HTML & CSS
backend.book_list_2 # undefined method `book_list_2' for #<Engineer:0x000055ad3efe0650>
可以發現用 object.method 這個寫法也有結果跑出來,而且還能限制不讓別的 instance 使用,原來這種只屬於一個物件的方法,就叫做 singleton method
。
full_stack.singleton_methods # 印出 [:book_list_2]
補充:在 Ruby 中,對物件使用 .singleton_methods
方法可列出其所有 singleton methods 。
那麼類別方法也一樣能寫出 singleton method 嗎?
class OOP
def self.rule_1
puts "don't repeat yourself"
end
end
def OOP.rule_2
puts "convention over configuration"
end
OOP.singleton_methods # 印出 [:rule_1, :rule_2]
不僅僅可以,我們甚至發現原來類別方法就是一種 singleton method ,那真的只有一個物件能夠使用嗎?
class OOP
def self.rule_1
"don't repeat yourself"
end
end
def OOP.rule_2
"convention over configuration"
end
class Rails < OOP; end
Rails.rule_1 # 印出 "don't repeat yourself"
Rails.rule_2 # 印出 "convention over configuration"
Rails.singleton_methods # 印出 [:rule_1, :rule_2]
其實無論是類別方法或實體方法透過繼承就能使用。
明天的篇幅會是比較需要想像的,更具體的找出 singleton method
的脈絡。
此文同步刊登於CJ-Han的網站